#! /usr/bin/perl 
use warnings;
use strict;
use Getopt::Std;
my %options=();
getopts("f:h:b:t:", \%options);
my $output_file_name = "$options{t}_toplevel.sdc";
open FILE, "$options{f}";
open HEADER, "$options{h}";
open TAIL, "$options{b}";
my $start_parsing = 0;

open FILE2, ">output1";
open FILE3, ">output2";
open FILE4, ">output3";
open FILE5, ">output4";
open OUTPUT, ">$output_file_name";
while(<HEADER>)
{
		print OUTPUT $_;
}

while(<FILE>)
{
# find the markers
		chomp;
		if ($_ =~ /\/\/start_marker/)
		{
				$start_parsing = 1;
		}
		if ($_ =~ /\/\/end_marker/)
		{
				$start_parsing = 0;
		}
		if ($start_parsing == 1)
		{

				my @fields = split;
		if ($fields[0] eq "input")
		{
				$fields[1] =~ s/\;//g ;
				if ($fields[1] eq "clk")
				{
							print FILE2 "set_dont_touch [get_nets {clk}]\n" ;
				}
				else
				{
						if ($fields[1] =~ /\[\d+:0\]/)
						{
							$fields[1] =~ s/\[//g ;
							$fields[1] =~ s/\]//g ;
							chomp($fields[1]);
							my @nums = split /:/, $fields[1];
							my $counter = 0;
							$fields[2] =~ s/;//g ;
							while ($nums[0] >= 0) 
							{
							my	$port = "$fields[2]_in[$counter]";
							print FILE2 "set_dont_touch [get_nets {$port}]\n" ;
							print FILE3 "set_driving_cell -lib_cell  PBCCT8B_T -pin P -from_pin A [get_ports {$port}]\n" ;
							print FILE4 "set_load 0.01127 [get_ports {$port}]\n" ;
							print FILE5 "set_input_delay -add_delay 0.8 -clock [get_clocks {V_clk}] [get_ports {$port}]\n" ;
							
								$counter++;
								$nums[0]--;
							}

						}
						else
						{
								$fields[1] =~ s/\;//g ;
							my	$port = "$fields[1]_out";
							print FILE2 "set_dont_touch [get_nets {$port}]\n" ;
							print FILE3 "set_driving_cell -lib_cell  PBCCT8B_T -pin P -from_pin A [get_ports {$port}]\n" ;
							print FILE4 "set_load 0.01127 [get_ports {$port}]\n" ;
							print FILE5 "set_input_delay -add_delay 0.8 -clock [get_clocks {V_clk}] [get_ports {$port}]\n" ;
						}
				}
		}
		elsif ($fields[0] eq "output")
		{
				if ($fields[1] =~ /\[\d+:0\]/)
				{
						$fields[1] =~ s/\[//g ;
						$fields[1] =~ s/\]//g ;
						chomp($fields[1]);
						my @nums = split /:/, $fields[1];
						my $counter = 0;
						$fields[2] =~ s/;//g ;
						while ($nums[0] >= 0) 
						{
							my	$port = "$fields[2]_out[$counter]";
							print FILE2 "set_dont_touch [get_nets {$port}]\n" ;
							print FILE4 "set_load 0.01127 [get_ports {$port}]\n" ;
							print FILE5 "set_output_delay -add_delay 0.8 -clock [get_clocks {V_clk}] [get_ports {$port}]\n" ;
								$counter++;
								$nums[0]--;
						}

				}
				else
				{
						$fields[1] =~ s/\;//g ;
							my	$port = "$fields[1]_out";
							print FILE2 "set_dont_touch [get_nets {$port}]\n" ;
							print FILE4 "set_load 0.01127 [get_ports {$port}]\n" ;
							print FILE5 "set_output_delay -add_delay 0.8 -clock [get_clocks {V_clk}] [get_ports {$port}]\n" ;
				}
		}
}
}
close FILE2;
close FILE3;
close FILE4;
close FILE5;
open FILE2, "output1";
open FILE3, "output2";
open FILE4, "output3";
open FILE5, "output4";

while(<FILE2>)
{
		print OUTPUT $_;
}
while(<FILE3>)
{
		print OUTPUT $_;
}
while(<FILE4>)
{
		print OUTPUT $_;
}
while(<FILE5>)
{
		print OUTPUT $_;
}

while(<TAIL>)
{
		 print OUTPUT $_;
}

